package com.yonyou.iuap.activiti.demo.test;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.beans.Transient;
import java.util.List;

/**
 * 流程实例API
 * act_hi_actinst 流程图上正在执行的元素或者已经执行完成的元素成为activity instance
 *  proc_def pdid
 *  proc_inst_id 流程实例ID
 *  execution_id 执行ID
 *  act_id activity
 *  act_name
 *  act_type
 *
 * act_hi_procinst 历史的流程实例,正在执行的流程实例也在这张表中,如果end_time为null,说明正在执行,如果有值,说明实例已经结束.
 *
 * act_hi_taskinst 历史任务,正在执行的任务也在这张表中,如果end_time为null,说明正在执行,如果有值,说明实例已经结束
 *
 * act_ru_execution 正在执行的流程实例列表,如果当前正在执行的流程实例结束以后,该行就在这张表中被删除了,所以该表是一个临时表
 *   proc_inst_id_ piid 流程示例id,如果不存在并发的情况下,piid和executionID是一样的
 *   act_id_ 当前正在执行的流程实例(如果不考虑并发的情况下)的正在执行的activity中有一个,所以act_id就是当前正在执行的流程示例的正在执行的节点
 *
 * act_ru_task 正在执行的任务表,如果当前任务被完成以后,任务就在这张表中被删除掉了,该表是一个临时表
 *  id_ 主键 任务ID
 *  execution_id_ 执行id 根据该id查询出来的任务肯定是一个
 *  proc_inst_id_ : piid  根据该id 查询出来的任务 如果没有并发,则是一个,如果有并发,则是多个;
 *  name_ 任务的名称
 *  assignee_ 任务执行人
 */
public class ActivitiInstanceDemo {

    /**
     * 启动流程实例,通过PID act_re_procdef
     */
    @Test
    public void testStartProcessInstanceByPid(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById("shenqing:1:12504");
        System.out.println(processInstance.getId());
    }

    /**
     * 根据pdKey 启动流程实例,默认启动最高版本 key 就是 shenqing:1:12504 的第一部分,其中 1表示版本号
     */
    @Test
    public void testStartProcessInstanceByPDKey(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRuntimeService().startProcessInstanceByKey("shenqing");
    }

    /**
     * 完成任务,其中任务id通过act_ru_task 中获取
     */
    @Test
    public void finishTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService().complete("17504");
    }

    /**
     * 查询任务
     * 根据任务执行人查询正在执行的任务(act_ru_task数据表)
     */
    @Test
    public void queryTaskByAssignee(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        List<Task> taskList = processEngine.getTaskService()
                .createTaskQuery()
                .orderByTaskCreateTime()
                .desc()
                .taskAssignee("小毛")
                .list();

        for (Task task : taskList) {
            //输出任务节点名称 和参与人名称
            System.out.println(task.getName());
            System.out.println(task.getAssignee());
        }
    }

    /**
     * 查询所有正在执行的任务
     */
    @Test
    public void queryTasks(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        List<Task> tasks = processEngine.getTaskService().createTaskQuery()
                .list();
        for(Task task : tasks){
            System.out.println(task.getName());
        }
    }

    /**
     * 根据piid查询任务
     */
    @Test
    public void testQueryTaskByPIID(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        List<Task> tasks = processEngine.getTaskService().createTaskQuery()
                .executionId("17501").list();
        for (Task task : tasks) {
            System.out.println(task.getName());
        }

    }

    /**
     * 根据piid得到当前正在执行的流程实例的正在活动的节点
     */
    @Test
    public void testActivity(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        ProcessInstance processInstance = processEngine.getRuntimeService()
                .createProcessInstanceQuery()
                .processInstanceId("17501")
                .singleResult();
        String activityId = processInstance.getActivityId();
        System.out.println(activityId);
    }

    /**
     * 查询历史任务,包括当前正在执行和已经执行完成的任务,可以通过 DeleteReson这个字段进行区别.
     * act_his_taskinst 表中有一个DELETE_RESON_字段.
     */
    @Test
    public void testHistoryTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        List<HistoricTaskInstance> taskInstanceList = processEngine.getHistoryService().createHistoricTaskInstanceQuery()
                //只获取已经执行完成的任务可以加下面的条件.
                .taskDeleteReason("completed")
                .list();

        List<HistoricTaskInstance> taskInstances = processEngine.getHistoryService().createHistoricTaskInstanceQuery()
                .list();

        System.out.println("执行完成的任务:"+ taskInstanceList.size());
        System.out.println("所有的总任务数(执行完和当前未执行完的:"+ taskInstances.size());
    }
}
